from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

db = SQLAlchemy()


# 用户模型
class User(db.Model):
    __tablename__ = 'users'# 数据库表名
    id = db.Column(db.Integer, primary_key=True) # 主键ID
    username = db.Column(db.String(50), unique=True, nullable=False)  # 唯一用户名
    email = db.Column(db.String(100), unique=True, nullable=False)# 唯一邮箱
    password_hash = db.Column(db.String(255), nullable=False)# 密码哈希值
    role = db.Column(db.Enum('user', 'admin'), default='user', nullable=False)# 用户角色
    created_at = db.Column(db.DateTime, default=datetime.utcnow)# 创建时间
    avatar_url = db.Column(db.String(255), nullable=True)  # 头像URL
    bio = db.Column(db.Text, nullable=True)  # 个人简介

# 句子对模型
class SentencePair(db.Model):
    __tablename__ = 'sentence_pairs' 
    id = db.Column(db.Integer, primary_key=True)
    lang1 = db.Column(db.String(10), nullable=False)# 第一种语言代码
    text1 = db.Column(db.Text, nullable=False)   # 第一种语言文本
    lang2 = db.Column(db.String(10), nullable=False) # 第二种语言代码
    text2 = db.Column(db.Text, nullable=False)        # 第二种语言文本
    source = db.Column(db.String(20), default='manual')# 数据来源
    status = db.Column(db.Enum('pending', 'approved', 'rejected'), default='pending')# 审核状态
    uploaded_by = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='SET NULL'))# 上传用户
    created_at = db.Column(db.DateTime, default=datetime.utcnow)


# 生成句子对模型
class GeneratedPair(db.Model):
    __tablename__ = 'generated_pairs'
    id = db.Column(db.Integer, primary_key=True)
    lang1 = db.Column(db.String(10), nullable=False)
    lang2 = db.Column(db.String(10), nullable=False)
    text2 = db.Column(db.Text, nullable=False)
    prompt_used = db.Column(db.Text)# 使用的生成提示词
    generated_by = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='CASCADE'), nullable=False)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)

    # 敏感词模型
class SensitiveWord(db.Model):
    __tablename__ = 'sensitive_words'
    id = db.Column(db.Integer, primary_key=True)
    word = db.Column(db.String(100), nullable=False, unique=True)


# 收藏模型
class Favorite(db.Model):
    """
    用户收藏模型
    
    用于存储用户收藏的句子对，建立用户与句子对之间的多对多关系。
    通过唯一索引防止用户重复收藏同一个句子对。
    """
    __tablename__ = 'favorites'
    
    id = db.Column(db.Integer, primary_key=True, comment='主键ID')
    user_id = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='CASCADE'), nullable=False, comment='用户ID')
    sentence_pair_id = db.Column(db.Integer, db.ForeignKey('sentence_pairs.id', ondelete='CASCADE'), nullable=False, comment='句子对ID')
    created_at = db.Column(db.DateTime, default=datetime.utcnow, comment='收藏时间')
    
    # 建立关系
    user = db.relationship('User', backref='favorites')
    sentence_pair = db.relationship('SentencePair', backref='favorited_by')
    
    # 唯一约束：防止重复收藏
    __table_args__ = (
        db.UniqueConstraint('user_id', 'sentence_pair_id', name='uk_user_sentence'),
    )


# 历史记录模型
class UserHistory(db.Model):
    """
    用户历史记录
    用于存储检索与LLM对话的页面快照，支持可选用户ID（未登录为NULL）。
    """
    __tablename__ = 'user_history'
    id = db.Column(db.Integer, primary_key=True, comment='主键ID')
    history_uid = db.Column(db.String(64), nullable=False, unique=True, comment='前端生成的历史ID')
    user_id = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='SET NULL'), nullable=True, comment='用户ID')
    type = db.Column(db.Enum('retrieve', 'llm'), nullable=False, comment='记录类型')
    route_name = db.Column(db.String(64), nullable=False, comment='前端路由名')
    summary = db.Column(db.String(255), nullable=False, comment='摘要')
    snapshot_json = db.Column(db.Text, nullable=False, comment='页面快照JSON')
    created_at = db.Column(db.DateTime, default=datetime.utcnow, comment='创建时间')

    user = db.relationship('User', backref='history_records')


# LLM对话历史记录模型
class LLMHistory(db.Model):
    """
    LLM对话历史记录模型
    
    用于存储用户的LLM对话历史记录，包括用户输入、模型输出、对话状态等信息。
    对应数据库表 llm_history。
    """
    __tablename__ = 'llm_history'
    
    id = db.Column(db.Integer, primary_key=True, comment='主键ID')
    user_id = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='CASCADE'), nullable=False, comment='用户ID')
    prompt = db.Column(db.Text, nullable=False, comment='用户输入')
    response = db.Column(db.Text, nullable=False, comment='模型输出')
    model = db.Column(db.String(50), default='qwen-turbo', comment='使用的模型')
    input_length = db.Column(db.Integer, default=0, comment='输入长度')
    output_length = db.Column(db.Integer, default=0, comment='输出长度')
    session_state = db.Column(db.Text, nullable=True, comment='对话完整状态序列化')
    created_at = db.Column(db.DateTime, default=datetime.utcnow, comment='创建时间')
    
    # 建立关系
    user = db.relationship('User', backref='llm_histories')
    
    # 索引
    __table_args__ = (
        db.Index('idx_user_created', 'user_id', 'created_at'),
    )


# 数据检索历史记录模型
class SearchHistory(db.Model):
    """
    数据检索历史记录模型
    
    用于存储用户的数据检索历史记录，包括检索关键词、检索类型、语言筛选、结果数量等信息。
    对应数据库表 search_history。
    """
    __tablename__ = 'search_history'
    
    id = db.Column(db.Integer, primary_key=True, comment='主键ID')
    user_id = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='CASCADE'), nullable=False, comment='用户ID')
    keyword = db.Column(db.String(100), nullable=False, comment='检索关键词')
    search_type = db.Column(db.String(20), default='simple', comment='搜索类型')
    lang1 = db.Column(db.String(10), nullable=True, comment='源语言')
    lang2 = db.Column(db.String(10), nullable=True, comment='目标语言')
    threshold = db.Column(db.Float, default=0.1, comment='相似度阈值')
    result_count = db.Column(db.Integer, default=0, comment='结果数量')
    page_state = db.Column(db.Text, nullable=True, comment='序列化页面完整状态')
    created_at = db.Column(db.DateTime, default=datetime.utcnow, comment='创建时间')
    
    # 建立关系
    user = db.relationship('User', backref='search_histories')
    
    # 索引
    __table_args__ = (
        db.Index('idx_user_created', 'user_id', 'created_at'),
    )